#include <variant>
#include <iostream>

#include "db.h"
#include "db_op.h"


void Libaray_Operater::DatebaseOperation(MYSQL* db, const char* op) {
    if (mysql_query(db, op)) {
        std::cerr << "Query error: " << mysql_error(db) << std::endl;
        result = false;  // 设置结果为false表示操作失败
    }
    else {
        MYSQL_RES* res = mysql_store_result(db);
        if (res != nullptr) {
            // 如果是查询语句，保存查询结果

            QueryResult query_result;
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                RowData rowData;
                for (unsigned int i = 0; i < mysql_num_fields(res); ++i) {
                    if (row[i] != nullptr) {
                        rowData.fields.push_back(row[i]);
                    } else {
                        rowData.fields.push_back("NULL");
                    }
                }
                query_result.rows.push_back(rowData);
            }
            result = std::make_pair(query_result,mysql_num_rows(res));
        }
        else {
            // 对于非查询语句，获取受影响的行数
            uint64_t affected_rows = mysql_affected_rows(db);
            if (affected_rows > 0) {
                result = affected_rows;  // 存储受影响的行数
            }
            else {
                result = uint64_t(0);  // 没有受影响的行
            }
        }
    }
}

uint64_t Libaray_Operater::getUpdateResult() {
    if (std::holds_alternative<uint64_t>(result)) {
        return std::get<uint64_t>(result);
    }
    return -1;  // 返回-1表示没有更新结果
}

std::pair<QueryResult,uint64_t> Libaray_Operater::getQueryResult() {
    if (std::holds_alternative<std::pair<QueryResult,uint64_t>>(result)) {
        return std::get<std::pair<QueryResult,uint64_t>>(result);
    }
    return std::make_pair(QueryResult(),0);  // 返回nullptr表示没有查询结果
}

bool Libaray_Operater::IsOperationSuccess(){
    if(std::holds_alternative<bool>(result)){
        return std::get<bool>(result);
    }
    return true;
}